/**
 * 
 */
package neptune.manager.connector;

import org.libvirt.LibvirtException;

/**
 * Rappresenta una infrastruttura di connessione agli Hypervisor. I metodi
 * esposti sono adoperati per eseguire tutte le operazioni supportate dai vari
 * hypervisor, che sono di utilita' per il sistema.
 * 
 * @author Roberto Bifulco [RobertoBifulco.it] [info@robertoBifulco.it]
 * @author Luigi Lorenzo Arpino [luigiarpino@yahoo.it]
 */
public interface Connector {

	public void cloneVM(String vmId, String destinationPath)
			throws ConnectorException;

	public void closeConnection() throws ConnectorException;

	/**
	 * Questo metodo e' strettamente legato allo script clone.sh
	 * 
	 * 
	 * @param vmId
	 *            identificativo completo della macchina da creare
	 * @param ipAddress
	 *            indirizzo di controllo da assegnare alla vm
	 * @param netMask
	 *            dell'indirizzo di controllo
	 * @param macAddresses
	 *            delle interfacce del nodo
	 * @param sourceTemplatePath
	 *            immagine da clonare della vm (path completo)
	 * @param destTemplatePath
	 *            dove clonare l'immagine (path completo)
	 * @param typeDistribution
	 * @param memory
	 * @param pathScriptClone
	 *            dove si trova lo script per fare il cloning (sul web
	 *            server)(path completo)
	 * @param pathLosetup
	 *            default /sbin
	 * @param pathKpartx
	 *            default /sbin
	 * @param bridge
	 *            il bridge di xen sul quale collegare le interfacce di rete
	 * @throws ConnectorException
	 */
	public void createVM(String vmId, String ipAddress, String netMask,
			String gateway, String[] macAddresses, String sourceTemplatePath,
			String destTemplatePath, int typeDistribution, int memory,
			String pathScriptClone, String pathLosetup, String pathKpartx,
			String bridge) throws ConnectorException;

	/**
	 * Fornisce informazioni circa i domini in esecuzione
	 * 
	 * Ogni riga della matrice fa riferimento ad un dominio distinto La 1°
	 * colonna contiene l'id numerico (XEN) del dominio la 2° colonna contiene
	 * il nomi del dominio la 3° colonna contiene lo stato* del dominio la 4°
	 * colonna contiene la memoria ram occupata
	 * 
	 * *stato={NOSTATE, RUNNING, BLOCKED, PAUSED, SHUTDOWN, SHUTOFF, CRASHED}
	 * 
	 * @return
	 * @throws LibvirtException
	 */
	public String[][] getAllDomains() throws ConnectorException;

	/*
	 * ====================================================================
	 */

	/**
	 * Richiede ad una data PM il suo stato. Il vettore di stringhe restituito
	 * contiene le informazioni richieste.
	 * 
	 * [0] = # CPU presenti; [1] = RAM in MB presente fisicamente; [2] =
	 * dimensione hard disk in GB;
	 * 
	 * @param address
	 * @param port
	 * @return
	 */
	public String[] getPhysicalMachineStatus() throws ConnectorException;

	/**
	 * Restituisce Una riga di getAllDomains
	 * 
	 * @param vmId
	 * @return
	 */
	public String[] getVMStatus(String vmId) throws ConnectorException;

	public void pauseVM(String vmId) throws ConnectorException;

	public void rebootVM(String vmId) throws ConnectorException;

	public void startVM(String vmId) throws ConnectorException;

	/**
	 * Executes a virtual machine swap in. The VM image file path is passed as a
	 * param.
	 * 
	 * @param vmId
	 * @param imgFilePath
	 * @param ramDim
	 * @param macAddresses
	 * @param bridge
	 * @throws ConnectorException
	 */
	public void swapInVM(String vmId, String imgFilePath, int ramDim,
			String[] macAddresses, String bridge) throws ConnectorException;

	/**
	 * Effettua lo swap out della VM
	 * 
	 * @param vmId
	 *            identificativo completo della VM da deallocare
	 * @throws ConnectorException
	 */
	public void swapOutVM(String vmId) throws ConnectorException;

	/**
	 * Effettua lo shutdown della macchina virtuale e cancella il file di
	 * immagine
	 * 
	 * @param vmId
	 *            identificativo completo della VM da terminare
	 * @throws ConnectorException
	 */
	public void TerminateVM(String vmId) throws ConnectorException;
}
